package filter;

import beans.User;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import service.UserService;
import utils.CookieUtils;

import java.io.IOException;

/**
 * 过滤器拦截所有请求=>过滤器处理之后=>放行
 * 自动登录过滤器核心目的：恢复用户登录状态
 *      判断用户登录状态（判断session中是否由用户）
 *      1.有=>用户依然是登录状态=>没必要利用过滤器还原会话状态=>直接放行
 *      2.没有
 *          a.查找name为autoLogin的cookie
 *              1.如果没有找到name为autoLogin的cookie=>说明用户登录没有勾选记住我=>放行
 *              2.如果找到name为autoLogin的cookie
 *                  从cookie中取出用户名和密码，根据用户名和密码查询数据库
 *                  1.查到=>将用户信息存入session=>用户会话状态恢复=>放行
 *                  2.没查到=>cookie中用户信息有可能篡改=>不恢复会话状态=>放行
 */
@WebFilter("/*")
public class AutoLoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //1.判断用户登录状态（判断session中是否有用户）
        User existUser = (User) req.getSession().getAttribute("existUser");
        if (existUser != null) {
            chain.doFilter(req,resp);
        }else {
            //没有会话状态
            Cookie cookie = CookieUtils.getCookie("autoLogin", req.getCookies());
            if (cookie == null){
                chain.doFilter(req,resp);
            }else{
                String[] values = cookie.getValue().split("|");
                //从cookie中取出用户名和密码，根据用户名和密码查询数据库
                UserService userService = new UserService();
                User user = userService.login(new User(values[0], values[1]));
                if (user == null) {
                    //说明没有查到=>cookie中的用户被篡改=>不恢复会话状态=>放行
                    chain.doFilter(req,resp);
                }else{
                    //查到=>将用户信息存入session=>用户会话状态恢复=>放行
                    req.getSession().setAttribute("existUser",user);
                    chain.doFilter(req,resp);
                }
            }
        }
    }
}
